'use strict';

module.exports = core;

const path = require('path')
const semver = require('semver')        // 版本比对
const colors = require('colors/safe')   // 终端打印不同颜色
const userHome = require('user-home')   // 快速拿到用户的主目录
const pathExists = require('path-exists').sync// 判断文件是否存在
const commander = require('commander')  // 命令注册

// require只支持加载3种文件:.js/.json/.node，默认是加载.js文件，如果文件里是正确的js代码，就可以正常执行
const pkg = require('../package.json')
let args
// const file = require('../file.txt')
// file()

const program = new commander.Command()

const log = require('@hjy-cli/log')
const exec = require('@hjy-cli/exec')

const constant = require('./const')

async function core() {
    try {
        await prepare()
        // 脚手架命令注册
        registerCommand()
    } catch(e) {
        log.error(e.message)
        if (program.debug) {
            console.log(e)
        }
    }
}

async function prepare () {
    checkPkgVersion()// 获取package.json版本号(version)
    // checkNodeVersion()// 检查node版本号，有的底版本node不支持语法
    checkRoot()
    checkUserHome()
    // checkInputArgs()
    checkEnv()
    await checkGlobalUpdate()
}

// 脚手架命令注册
function registerCommand() {
    // hjy-cli init test-project --targetPath /xxx
    program
        .name(Object.keys(pkg.bin)[0])      // 脚手架名称
        .usage('<command> [options]')   // 使用建议，与yargs一样：usage里的内容会打印在最前面
        .version(pkg.version)
        .option('-d, --debug', '是否开启调试模式', false)
        .option('-tp, --targetPath <targetPath>', '是否指定本地调试文件路径', '')

    // hjy-cli init test-project --force
    program
        .command('init [projectName]')
        .option('-f, --force', '是否强制初始化项目')
        .action(exec)

    // hjy-cli --debug
    // 开启debug模式
    program.on('option:debug', function() {
        if (program.debug) {
            process.env.LOG_LEVEL = 'verbose'
        } else {
            process.env.LOG_LEVEL = 'info'
        }
        log.level = process.env.LOG_LEVEL
    })

    // 指定targetPath（相当于把变量挂到process上，实现解耦）
    program.on('option:targetPath', function () {
        // program.targetPath = D:/software/Git/xxx
        process.env.CLI_TARGET_PATH = program.targetPath
    })

    // 未知命名监听
    program.on('command:*', function (obj) {
        const availableCommands = program.commands.map(cmd => cmd.name())
        console.log(colors.red('未知的命名：' + obj[0]))
        if (availableCommands.length > 0) {
            console.log(colors.red('可用命令：' + availableCommands.join(',')))
        }
    })

    program.parse(program.argv)

    // 没有命令输入，打印出所有命令
    if (program.args && program.args.length < 1) {
        // 显示帮助文档
        program.outputHelp()
        // 答应空行，避免文字挤到一起
        console.log()
    }
}

// 检查是否需要更新
async function checkGlobalUpdate() {
    // 1、获取当前版本号和模块名
    const currentVersion = pkg.version
    const npmName = pkg.name

    // 2、调用npm API
    const { getNpmSemverVersion } = require('@hjy-cli/get-npm-info')
    const lastVersion = await getNpmSemverVersion(currentVersion, npmName)
    // 3、提取所有版本号，比对哪些版本号是大于当前版本号
    if (lastVersion && semver.gt(lastVersion, currentVersion)) {
        // 4、获取最新的版本号，提示用户更新到该版本
        log.warn(colors.yellow(`请手动更新 ${npmName}，当前版本：${currentVersion}，最新版本：${lastVersion}
        更新命令：npm install -g ${npmName}`))
    }
}

// 检查环境变量
function checkEnv () {
    // dotenv：获取环境变量
    const dotenv = require('dotenv')
    const dotenvPath = path.resolve(userHome, '.env')

    // C:\Users\hjy\.env获取文件里的内容
    if (pathExists(dotenvPath)) {
        dotenv.config({
            path: dotenvPath
        })
    }
    createDefaultConfig()
    // log.verbose('环境变量', process.env.CLI_HOME_PATH)
}

// 判断用户是否有配置CLI_HOME
function createDefaultConfig () {
    const cliConfig = {
        home: userHome
    }
    if (process.env.CLI_HOME) {
        cliConfig['cliHome'] = path.join(userHome, process.env.CLI_HOME)
    } else {
        cliConfig['cliHome'] = path.join(userHome, constant.DEFAULT_CLI_HOME)
    }
    process.env.CLI_HOME_PATH = cliConfig.cliHome
}


// 检查入参
// hjy-cli --debug
// function checkInputArgs() {
//     // 参数解析：minimist
//     const minimist = require('minimist')
//     // process.argv.slice(2)用户输入的参数
//     // { _: [ 'hjy-cli' ], debug: true }
//     args = minimist(process.argv.slice(2))
//     // debug模式开发
//     checkArgs()
// }

// debug模式开发
// function checkArgs () {
//     console.log('开启debug')
//     if (args.debug) {
//         process.env.LOG_LEVEL = 'verbose'
//     } else {
//         process.env.LOG_LEVEL = 'info'
//     }
//     log.level = process.env.LOG_LEVEL
// }

// 检查主目录是否存在
function checkUserHome() {
    // userHome等于C:\Users\hjy
    if (!userHome || !pathExists(userHome)) {
        throw new Error(colors.red('当前登录用户主目录不存在！'))
    }
}

// 检查root启动
function checkRoot () {
    // 账户检查和自动降级(不管是用root启动还是sudo启动，都是一样的)
    const rootCheck = require('root-check')
    rootCheck()
}

// 获取package.json版本号(version)
function checkPkgVersion() {
    log.info('cli', pkg.version)
}